<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // var list = [2,8,4,6,5,7,9,3,1];
    // for(var i=0;i<list.length;i++){
    //     var item = list[i];
    //     console.log(item);
    // }

    // var list = [2,8,4,6,5,7,9,3,1];
    // for(var i in list){
    //     console.log(i,list[i]);
    // }


    // var list = [2,8,4,6,5,7,9,3,1];
    // for(var val of list){
    //     console.log(list.indexOf(val),val);
    // }


    // 需求: 模拟封装一个 遍历方法(调用此方法会自动遍历数组,执行特定的函数)

    // 遍历数组,执行特定的函数
    // function fn(item,index,array){   //形式参数
    //     console.log(item,index,array);  //用户拿到数据之后期望执行的内容
    // }
    
    // var list = [2,8,4,6,5,7,9,3,1];
    // for(var i=0;i<list.length;i++){  //自己遍历  自己取值
    //     var item = list[i];  // 循环当前元素
    //     var index = i;       // 循环当前的下标
    //     var array = list;      // 原数组
        
    //     fn(item,index,array);  // 函数调用 实际参数
    // }

    // setInterval(function(){},1000)
    // document.addEventListener("click",function(){})

    // 模拟封装
    // 遍历数组,每次循环时执行特定的函数
    // 回调函数(callback)  把函数当成参数 传入到另一个函数中,让它在另一个函数中执行 (可以理解为用户可以按照自己的需求 提前决定好要执行的内容)
    // list  需要遍历的数组
    // fn    每次遍历是执行的回调函数 (用户可以按照自己的需求 提前决定好要执行的内容)
    function myEach(list,fn){ //形式参数
        debugger;
        // 遍历数组,执行特定的函数
        // var fn = function(item,index,array){   
        //     console.log(item,index,array);  //用户拿到数据之后期望执行的内容
        // }
        // var list = [2,8,4,6,5,7,9,3,1];
        for(var i=0;i<list.length;i++){  //自己遍历  自己取值
            var item = list[i];  // 循环当前元素
            var index = i;       // 循环当前的下标
            var array = list;      // 原数组
              
            fn(item,index,array);  // 函数调用 实际参数
        }
    }

    // debugger;
    // var arr = ["a","b","c"];
    // myEach(arr,function(item,index,array){
    //     console.log(item,index,array);
    // })

    // var arr = ["a","b","c"];
    // var str = "";
    // myEach(arr,function(item,index,array){
    //     // console.log(item,index,array);
    //     str += item;
    // })
    // console.log(str);



    // map 

    function myMap(list,fn){ //形式参数
        // debugger;
        // 遍历数组,执行特定的函数
        // var fn = function(item,index,array){   
        //     console.log(item,index,array);  //用户拿到数据之后期望执行的内容
        // }
        // var list = [2,8,4,6,5,7,9,3,1];

        var arr = [];
        for(var i=0;i<list.length;i++){  //自己遍历  自己取值
            var item = list[i];  // 循环当前元素
            var index = i;       // 循环当前的下标
            var array = list;      // 原数组
              
            var result = fn(item,index,array);  // 函数调用 实际参数
            arr.push(result);
        }
        return arr;
    }





    function myFilter(list,fn){ //形式参数
        debugger;
        // 遍历数组,执行特定的函数
        // var fn = function(item,index,array){   
        //     console.log(item,index,array);  //用户拿到数据之后期望执行的内容
        // }
        // var list = [2,8,4,6,5,7,9,3,1];

        var arr = [];
        for(var i=0;i<list.length;i++){  //自己遍历  自己取值
            var item = list[i];  // 循环当前元素
            var index = i;       // 循环当前的下标
            var array = list;      // 原数组
            
            // 函数调用 实际参数
            var result = fn(item,index,array);  // 返回一个条件 (true|false)
            if(result){
                arr.push(item);
            }
        }
        return arr;
    }



    function mySome(list,fn){ //形式参数
        debugger;
        // 遍历数组,执行特定的函数
        // var fn = function(item,index,array){   
        //     console.log(item,index,array);  //用户拿到数据之后期望执行的内容
        // }
        // var list = [2,8,4,6,5,7,9,3,1];

        var arr = [];
        var flag = false; // 假设不存在满足条件的元素
        for(var i=0;i<list.length;i++){  //自己遍历  自己取值
            var item = list[i];  // 循环当前元素
            var index = i;       // 循环当前的下标
            var array = list;      // 原数组
            
            // 函数调用 实际参数
            var result = fn(item,index,array);  // 返回一个条件 (true|false)
            if(result){
                flag = true;
                break;
            }
        }
        return flag;
    }



    function myEvery(list,fn){ //形式参数
        debugger;
        // 遍历数组,执行特定的函数
        // var fn = function(item,index,array){   
        //     console.log(item,index,array);  //用户拿到数据之后期望执行的内容
        // }
        // var list = [2,8,4,6,5,7,9,3,1];

        var arr = [];
        var flag = true; // 假设所有的元素都满足条件
        for(var i=0;i<list.length;i++){  //自己遍历  自己取值
            var item = list[i];  // 循环当前元素
            var index = i;       // 循环当前的下标
            var array = list;      // 原数组
            
            // 函数调用 实际参数
            var result = fn(item,index,array);  // 返回一个条件 (true|false)
            if(result==false){ //只有一个不满足条件的元素 
                flag = false;
                break;
            }
        }
        return flag;
    }


    function myReduce(list,fn,initValue){ //形式参数
        // 遍历数组,执行特定的函数
        // var fn = function(item,index,array){   
        //     console.log(item,index,array);  //用户拿到数据之后期望执行的内容
        // }
        // var list = [2,8,4,6,5,7,9,3,1];
            
        // debugger;
        if(initValue != undefined){  // 有初始值
            var prev = initValue;
            for(var i=0;i<list.length;i++){  //自己遍历  自己取值
                var item = list[i];  // 循环当前元素
                var index = i;       // 循环当前的下标
                var array = list;      // 原数组
                
                //  // 函数调用 实际参数
                prev = fn(prev,item,index,array);   // 每次函数执行完毕  => 将函数执行的结果 赋值给prev  下次循环 函数调用时 传入
            }
        }else{
            var prev = list[0];
            for(var i=1;i<list.length;i++){  //自己遍历  自己取值
                var item = list[i];  // 循环当前元素
                var index = i;       // 循环当前的下标
                var array = list;      // 原数组
                
                //  // 函数调用 实际参数
                prev = fn(prev,item,index,array);   // 每次函数执行完毕  => 将函数执行的结果 赋值给prev  下次循环 函数调用时 传入
            }
        }
        
        return prev;
    }

    myReduce([2,8,4,6,5,7,9,3,1],function(prev,item,index,array){
        // debugger;
        console.log(prev,item,index,array);
        return prev + item;
    },0)







</script>
</html>